/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mx.its.dsw2.biblioteca.bl;

import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import mx.its.dsw2.biblioteca.dao.DetallePrestamoDaoLocal;
import mx.its.dsw2.biblioteca.dao.PrestamoDaoLocal;
import mx.its.dsw2.biblioteca.dao.UsuarioDaoLocal;
import mx.its.dsw2.biblioteca.enumeracion.EstadoDetallePrestamo;
import mx.its.dsw2.biblioteca.enumeracion.EstadoPrestamo;
import mx.its.dsw2.biblioteca.enumeracion.EstadoTransaccion;
import mx.its.dsw2.biblioteca.modelo.DetallePrestamo;
import mx.its.dsw2.biblioteca.modelo.Libro;
import mx.its.dsw2.biblioteca.modelo.Prestamo;
import mx.its.dsw2.biblioteca.modelo.Usuario;

/**
 *
 * @author Maq-8
 */
@Stateless
public class PrestamoBl implements PrestamoBlLocal {

    @EJB
    private UsuarioDaoLocal usuarioDao;
    @EJB
    private DetallePrestamoDaoLocal detallePrestamoDao;
    @EJB
    private PrestamoDaoLocal prestamoDao;

    @Override
    public EstadoTransaccion register(Prestamo lend, List<Libro> books) {
        int available = 3;

        List<Prestamo> incompleteLends =
                prestamoDao.findIncomplete(lend.getIdUsuario());
        for (Prestamo p : incompleteLends) {
            available = available - detallePrestamoDao.findLends(p).size();
        }
        if (available <= 0 || books.size() > available) {
            return EstadoTransaccion.INCOMPLETO;
        } else {
            Date d = new Date();
            lend.setFecha(d);
            lend.setHora(d);
            lend.setEstado(EstadoPrestamo.PENDIENTE.ordinal());
            prestamoDao.create(lend);
            for (Libro b : books) {
                DetallePrestamo dp = new DetallePrestamo();
                dp.setIdLibro(b);
                dp.setIdPrestamo(lend);
                dp.setEstado(EstadoDetallePrestamo.PRESTADO.ordinal());
                detallePrestamoDao.create(dp);
            }
            return EstadoTransaccion.COMPLETO;
        }
    }

    @Override
    public EstadoTransaccion takeBack(List<Libro> books) {
        for (Libro book : books) {
            DetallePrestamo dp = detallePrestamoDao.findBooks(book);
            if (dp == null) {
                return EstadoTransaccion.INCOMPLETO;
            } else {
                dp.setEstado(EstadoDetallePrestamo.REGRESADO.ordinal());
                detallePrestamoDao.edit(dp);
            }
        }
        return null;
    }

    //Agregar metodos de consulta 
    //PrestamosPendientesPorUsuario --> incompleteLendsByUser
    //Lista de libros Prestados Por Usuario  --> lendBooksByUser
    //Lista de prestamos vencidos --> generalIncompleteLends
    //Lista de libros prestamos --> generalLendsBooks
    @Override
    public List<Prestamo> incompleteLendsByUser(Usuario user) {
        return prestamoDao.findIncomplete(user);
    }

    @Override
    public List<Libro> lendBooksByUser(Usuario user) {
        return null;
    }

    @Override
    public List<Prestamo> getAll() {
        return prestamoDao.findAll();
    }
    
    
}
